package Persistencia;

import java.util.ArrayList;
import java.util.Calendar;

import Dominio.PerfilData;
import Dominio.UserData;

class UserDAO {

	public static void create(PerfilData user) throws PersistenciaException {
		user.set_fechaCreacion(Calendar.getInstance().getTime());
		int nif = user.get_usuario().get_nif();
		String n = user.get_usuario().get_nombre();
		String a1 = user.get_usuario().get_apellido1();
		String a2 = user.get_usuario().get_apellido2();
		String ni = user.get_usuario().get_nick();
		float s = user.get_usuario().get_saldo();
		String p = user.get_usuario().get_pass();
		String r = user.get_usuario().get_rolString();
		String fC = user.get_fechaCreacionString();
		String d = user.get_direccion();
		String cE = user.get_correoElectronico();
		long nC = user.get_cuentaBancaria();
		String fN = user.get_fechaNacimientoString();
		try {
			if (!Agente.getAgente().insert(
					"INSERT INTO Usuario (nif, nombre, apellido1, apellido2, nick, " +
					"saldo, pass, rol) VALUES ("
							+ nif + ",'" + n + "','" + a1 + "','"
							+ a2 + "','" + ni + "'," + s + ",'" + p + "','" + r +"')")
					|| !Agente.getAgente().insert(
							"INSERT INTO Perfil (nif, fechaCreacion, direccion, " +
							"correoElectronico, nCuenta, fechaNacimiento) VALUES ("
									+ nif + ",'"+ fC + "','" + d + "','" + cE 
									+ "'," + nC + ",'" + fN + "')")){
			}
		} catch (PersistenciaException e) {
			//delete(user);
			throw new PersistenciaException(e.getMessage());
		}
	}
	
	public static PerfilData read(String nick) throws PersistenciaException{
		String consulta = "SELECT nif FROM Usuario WHERE nick = '"+nick+"';";
		int nif;
		try{
			nif = (Integer)Agente.getAgente().selectList(consulta).get(0).get(0);
		}catch(Exception e){
			throw new PersistenciaException("No existe el usuario");
		}
		return read(nif);
	}
	
	public static PerfilData read(int nif) throws PersistenciaException{
		// Crear la conexion con el agente y obtener los datos para rellenar 1
		// user
		PerfilData ret = null;
		String consulta = "SELECT Usuario.nombre, Usuario.apellido1, Usuario.apellido2, Usuario.nick, "
				+ "Usuario.saldo, Usuario.pass, Usuario.rol, Perfil.fechaCreacion, Perfil.direccion, "
				+ "Perfil.correoElectronico, Perfil.nCuenta, Perfil.fechaNacimiento FROM Usuario, Perfil "
				+ "WHERE Usuario.nif = Perfil.nif AND Usuario.nif = " + nif;
		ArrayList<ArrayList<Object>> result = new ArrayList<ArrayList<Object>>();
		result = Agente.getAgente().selectList(consulta);
		if (result.isEmpty()) throw new PersistenciaException("No existe el usuario");
		else{ // existe el usuario
			ArrayList<Object> tupla = result.get(0); // Obtengo la tupla entera
			String nombre = (tupla.get(0) != null ? ((String)tupla.get(0)) : "");
			String apellido1 = (tupla.get(1) != null ? (String)tupla.get(1) : "");
			String apellido2 = (tupla.get(2) != null ? (String)tupla.get(2) : "");
			String nick = (tupla.get(3) != null ? (String)tupla.get(3) : "");
			float saldo = (tupla.get(4) != null ? (Float)tupla.get(4) : 0.0f);
			String pass = (tupla.get(5) != null ? (String)tupla.get(5) : "");
			String rol = (tupla.get(6) != null ? (String)tupla.get(6) : "");
			String fC = (tupla.get(7) != null ? (String)tupla.get(7).toString() : "");
			String direccion = (tupla.get(8) != null ? (String)tupla.get(8) : "");
			String correoE = (tupla.get(9) != null ? (String)tupla.get(9) : "");
			long nCuenta = (tupla.get(10) != null ? (Long)tupla.get(10) : 0);
			String fN = (tupla.get(11) != null ? (String)tupla.get(11).toString() : "");
			UserData user = new UserData(nif, nombre, apellido1, apellido2,
					nick, saldo, pass, rol);
			ret = new PerfilData(user, fC, direccion, correoE, nCuenta, fN);
		}
		return ret;

	}

	public static boolean update(PerfilData user) throws PersistenciaException{
		// Devuelve true si se ha actualizado correctamente a _user
		// nif, rol y fecha de creacion NO SE PUEDE CAMBIAR
		int nif = user.get_usuario().get_nif();
		ArrayList<String> columUpdateUsuario = new ArrayList<String>();
		ArrayList<String> valueUpdateUsuario = new ArrayList<String>();
		ArrayList<String> columUpdatePerfil = new ArrayList<String>();
		ArrayList<String> valueUpdatePerfil = new ArrayList<String>();
		PerfilData userAux = read(nif);
		diferencias(user, userAux, columUpdateUsuario, valueUpdateUsuario,
				columUpdatePerfil, valueUpdatePerfil);
		String updateUser = "UPDATE Usuario SET ";
		String updatePerfil = "UPDATE Perfil SET ";
		String set = "";
		String where = "WHERE nif = "+nif;
		
		//Update Usuario
		for(int i = 0; i < columUpdateUsuario.size(); i++){
			set += columUpdateUsuario.get(i)+" = "+valueUpdateUsuario.get(i);
			if(i+1 != columUpdateUsuario.size())
				set += ", ";
		}
		if(set.length() > 0){
			if(!Agente.getAgente().update(updateUser+set+" "+where)) return false;
			set = "";
		}
		
		//Update Perfil
		for(int i = 0; i < columUpdatePerfil.size(); i++){
			set += columUpdatePerfil.get(i)+" = "+valueUpdatePerfil.get(i);
			if(i+1 != columUpdatePerfil.size())
				set += ", ";
		}
		if(set.length() > 0){
			if(!Agente.getAgente().update(updatePerfil+set+" "+where)) return false;
		}
		
		return true;
	}

	private static void diferencias(PerfilData u, PerfilData aux,
			ArrayList<String> columUpdateUsuario,
			ArrayList<String> valueUpdateUsuario,
			ArrayList<String> columUpdatePerfil,
			ArrayList<String> valueUpdatePerfil) {
		if (!u.get_usuario().get_nombre()
				.equals(aux.get_usuario().get_nombre())) {
			columUpdateUsuario.add("nombre");
			valueUpdateUsuario.add("'"+u.get_usuario().get_nombre()+"'");
		}
		if (!u.get_usuario().get_apellido1()
				.equals(aux.get_usuario().get_apellido1())) {
			columUpdateUsuario.add("apellido1");
			valueUpdateUsuario.add("'"+u.get_usuario().get_apellido1()+"'");
		}
		if (!u.get_usuario().get_apellido2()
				.equals(aux.get_usuario().get_apellido2())) {
			columUpdateUsuario.add("apellido2");
			valueUpdateUsuario.add("'"+u.get_usuario().get_apellido2()+"'");
		}
		if (!u.get_usuario().get_nick().equals(aux.get_usuario().get_nick())) {
			columUpdateUsuario.add("nick");
			valueUpdateUsuario.add("'"+u.get_usuario().get_nick()+"'");
		}
		if (u.get_usuario().get_saldo() != aux.get_usuario().get_saldo()) {
			columUpdateUsuario.add("saldo");
			valueUpdateUsuario.add(String.valueOf(u.get_usuario().get_saldo()));
		}
		if (!u.get_usuario().get_pass().equals(aux.get_usuario().get_pass())) {
			columUpdateUsuario.add("pass");
			valueUpdateUsuario.add("'"+u.get_usuario().get_pass()+"'");
		}
		if (!u.get_direccion().equals(aux.get_direccion())) {
			columUpdatePerfil.add("direccion");
			valueUpdatePerfil.add("'"+u.get_direccion()+"'");
		}
		if (!u.get_correoElectronico().equals(aux.get_correoElectronico())) {
			columUpdatePerfil.add("correoElectronico");
			valueUpdatePerfil.add("'"+u.get_correoElectronico()+"'");
		}
		if (u.get_cuentaBancaria() != aux.get_cuentaBancaria()) {
			columUpdatePerfil.add("nCuenta");
			valueUpdatePerfil.add(String.valueOf(u.get_cuentaBancaria()));
		}
		if (!u.get_fechaNacimientoString().equals(aux.get_fechaNacimientoString())) {
			columUpdatePerfil.add("fechaNacimiento");
			valueUpdatePerfil.add("'"+u.get_fechaNacimientoString()+"'");
		}
	}

	public static boolean delete(PerfilData user) throws PersistenciaException{
		// Devuelve true si se ha eleminado correctamente a _user
		return delete(user.get_usuario().get_nif());
	}

	public static boolean delete(int nif) throws PersistenciaException{
		// Devuelve true si se ha eleminado correctamente a _user
		if(!Agente.getAgente().delete("DELETE FROM Usuario WHERE nif = "+nif)) return false;
		if(!Agente.getAgente().delete("DELETE FROM Perfil WHERE nif = "+nif)) return false;
		return true;
	}
}
